Ŀ Ŀ QuickBasic'de karlatm sorunlar nasl atm? Konu: Modemin Basic'de programlanmas (#3) ٳ PS 29 Aralk'95 Grol Demir ki aydr devam eden yaz dizimizde arlkl olarak modem programlama iin gerekli olan donanm ve makine dili bilgileri vermitik. Bu bilgilerin destei ile artk bizim tandmz basic diline yeniden merhaba diyebiliriz. Modem programlamada gerekli basic komutlarna gz atalm. Ŀ Ĵ OPEN "COM... Deyimi Amac : Bir iletiim dosyas amak Dili : GwBasic, TurboBasic, Qbasic, QuickBasic, .... Format : OPEN "COMn:[parametreler] FOR RANDOM AS #DosyaNo COMn : Seri genileme yuvasnn numarasdr. Com1 veya Com2 olabilir, dierlerine (Com3,Com4) izin verilmez. Bu ayn zamanda IRQ3 ve IRQ4'den bakasna da izin verilmeyecei anlamndadr. DosyaNo : Basic'in okuma yazma ilemleri iin kullanaca numaradr. Parametreler : Hz + Parite + Genilik + Dur + nemsiz dier parametrelerdir. Hz : 75,(..),2400,4800, 9600 Bps'dir.Varsaylan 300'dr. 9600 Bps'den hzl iletiime izin verilmez. Parite : Gnderme ve alma iin karlk belirtir. S,O,M,E,N deerlerini alabilirler. (tavsiye="N") Genilik : letiime konu karakter geniliini belirtir. 4,5,6,7,8 deerlerini alabilir. Varsaym 7 dir. Varsaylan uygulandnda Trke karakterler modem yoluyla iletilemezler. Bu nedenle "8" kullanlmak zorundadr. Dur : Durdurma bitlerinin saysn gsterir. Yksek hzda daima "1" kullanlr. Dier : nemsizdir. Yine de help dosyasna baknz. Tipik bir iletiim dosyas u ekilde bir komutla alr: Ŀ OPEN "Com2:2400,N,8,1" FOR RANDOM AS #1 Burda geen; Com2 yerine sadece Com1 atternatifdir. 2400 yerine ise normal koullarda 4800 veya 9600 alternatif olabilir. N,8,1 yerine atternatif kullanmaynz. #1 yerine makinenizin izin verdii herhangi bir dosya numaras olabilir. Ŀ Soru > Basic OPEN "COM..." deyiminde ne yapar? 1) Bellek ayrr : Basic balarken "C" anahtar ile bir iletiim bellek miktar belirtilmi ise (rn. QBX /C:16000 gibi) bu byklkte, yoksa 512 byte byklnde bir bellei iletiim de ambar olarak kullanmak zere ayrr. 2) Bu komutla verilen dosya numaras bundan byle sanki bir fiziki dosya numaras gibi grlsn diye ayarlamalar yapar. 3) Yeni bir interrupt rutini yazar. Eer OPEN "Com1... ise bu rutini Ch kesmesine, OPEN"Com2... ise Bh kesmesine atar bundan evvel eski kesmelere ait adresleri saklar. Bu rutinde kullanlmak zere ilgili aygtn adresini eer Com1 ise 40h:00 dan, eer Com2 ise 40h:02'den alr. 4) Modem portunu yani 40h:00 veya 40:02'den ald adresin bir fazlasn IRQ retmek iin programlar (OUT &H3F9, 11 gibi). 5) 8259 chip'inden IRQ hatt iin onay alr (Com1 iin IRQ4, Com2 iin IRQ3). Yukardaki ilemlerden 3, 4 ve 5 nci maddeler bir basic programnda mdahale edilmesi gerekenlerdir. Bunlar daha evvel iledik. 1 ve 2 nci maddeler ise bizim basic'den dn alacaklarmzdr. Ŀ Soru > Modemim Com4'de ise ne olacak ? Hemen basic dilini brakp Delphi'ye gein gibi acizlik belirtisi bir cevap vermeyeceim ama sorunun GwBasic'deki cevabn bilmiyorum. Bu nedenle eer GwBasic kullanyorsanz Qbasic veya Quick Basic'e gemenin tam sras diyerek GwBasic'de bu konudaki cahilliimi ilan edebilirim. Qbasic ve st basic ailesinden diller Com1 ve Com2'nin adresini BIOS'dan alrlar. Ŀ Bios'da 40h:00 Com1'in adresi 40h:02 Com2'nin adresi 40h:04 Com3'n adresi 40h:06 Com4'n adresi eklinde tutulur Eer modeminiz Com4'de ise ve iletiim dosyas OPEN "Com1... ile alacak ise tek yapacanz ey "OPEN" komutundan evvel bios'un 40h:00 adresine &H2E8 adresini aktarmaktr. Ŀ Ĵ CLOSE Deyimi Bu komutu modemi kapatmak iin kullanacaz fazla bir esprisi yoktur. Format: CLOSE #DosyaNo (rnein CLOSE #1) >HangUp (Balantnn kesilmesi) : Modem kapatlmadan evvel bir takm ilemleri iptal edilmelidir. Kapatlmaya allam modem o srada iletiim halinde veya bir telefon evirmekte olabilir. Modem u ilemler ile kapatlmaldr: Ŀ PRINT #1, "ATH" PRINT #1, CHR$(13) PRINT #1, "ATZ" OUT Port + 4, (INP(Port + 4) AND 252) CLOSE #1 Ŀ Ĵ PRINT Deyimi Bu komutu modeme veri gndermek iin kullanacaz fazla bir esprisi yoktur. Format: PRINT #DosyaNo,Veri$ (rnein PRINT #1, "ATZ") Ŀ Ĵ INPUT$ ve LOC Deyimleri Bu komutlar modemden veri okumak iin kullanacaz fazla bir esprileri yoktur. (rnein A$ = INPUT$(LOC(1),#1) Ŀ **********Ĵ Laf bitti, imdi i zaman ********** Buraya kadar rendiklerimiz sayesinde ter trl modemi basic'de programlayabiliriz. Paralar nasl birletireceiz? Aada verilen rnei iyi incelemenizi neririm. Aada verilen yordamlarda mikro ilemcinin basic'e esir dmesinin bir yllk zeti yer almaktadr. >te size bir terminal program ekirdei: Ŀ Balang Tavsiyeleri Ŀ 'QBASIC'de de alr ' bu dilde bellek sorunu nedeniyle yava bir hz seiniz. 'QuickBasic de almas iin ise versiyon 7.1 QBX /L QBX /C:32000 ' versiyon 4.5 QB /L QB /C:32000 ' eklinde yklenmelidir. Ŀ Ana Program Ŀ DECLARE SUB EkranAc (Tip!) DECLARE SUB Terminal () DECLARE SUB ModemiKapa (ModemAdresi!) DECLARE SUB ModemiAc (ModemAdresi!, Hiz!, IrqNo!) DIM SHARED Sakla(27) '================================================= 'Deikenler 'Kendi modem bilgilerinizi giriniz Irq = 5: Port = &H3E8: Baud = 57600: Ansi = 1 'Seenekler 'Irq = 2: Port = &H2E8: Baud = 2400 : Ansi = 1 'Irq = 3: Port = &H2F8: Baud = 4800 : Ansi = 0 'Irq = 4: Port = &H3E8: Baud = 9600 'Irq = 5: Port = &H3F8: Baud = 14400 'Irq = 7 : Baud = 19200 ' Baud = 38400 ' Baud = 57600 ' Baud = 115200 '================================================= 'Program balangc CALL ModemiAc(Port, Baud, Irq) EkranAc (Ansi) Terminal ModemiKapa (Port) END '================================================= 'IRQ hattnn almas iin makine dili yordam IRQSerbest: DATA &H50 : 'PUSH AX DATA &H53 : 'PUSH BX DATA &H51 : 'PUSH CX DATA &HFA : 'CLI DATA &H31, &HC9 : 'XOR CX,CX DATA &HB1, 2 : 'MOV CL,02 DATA &HBB, 1, 0 : 'MOV BX,0001 DATA &HD3, &HE3 : 'SHL BX,CL DATA &HF7, &HD3 : 'NOT BX DATA &HE4, &HA1 : 'IN AL,A1 DATA &H20, &HF8 : 'AND AL,BH DATA &HE6, &HA1 : 'OUT A1,AL DATA &HE4, &H21 : 'IN AL,21 DATA &H20, &HD8 : 'AND AL,BL DATA &HE6, &H21 : 'OUT 21,AL DATA &HFB : 'STI DATA &H59 : 'POP CX DATA &H5B : 'POP BX DATA &H58 : 'POP AX DATA &HCB : 'RETF Ŀ Ekran Ama Yordam Ŀ 'Ekran Ansi veya TTY modda alyor SUB EkranAc (Tip) IF Tip = 1 THEN OPEN "CON" FOR OUTPUT AS #2 'Ansi ELSE OPEN "SCRN:" FOR OUTPUT AS #2 'TTY END IF END SUB Ŀ Modem Ama Yordam Ŀ SUB ModemiAc (ModemAdresi, Hiz, IrqNo) 'Baz deerler saklanyor DEF SEG = 0 FOR I = 40 TO 63 'nterrupt adresleri Sakla(I - 40) = PEEK(I) NEXT Sakla(24) = INP(&H21) '8259 (PIC) deerleri Sakla(25) = INP(&HA1) Sakla(26) = PEEK(1026) 'Com2 eski aygt adresi Sakla(27) = PEEK(1027) '========================================================= 'Com2'ye bizim modem atanyor POKE 1027, ModemAdresi \ 256 POKE 1026, ModemAdresi AND 255 '========================================================= 'Yeni aygt (bizim modem) alyor OPEN "Com2:2400,N,8,1" FOR RANDOM AS #1 '========================================================= 'Modem seilen hz iin ayarlanyor Sakla = INP(ModemAdresi + 3) OUT ModemAdresi + 3, 128 OUT ModemAdresi, 115200 / Hiz OUT ModemAdresi + 3, Sakla '========================================================= 'Com2'ye ait IRQ3 kapatlyor, PIC deerleri iade ediliyor OUT &H21, Sakla(24) OUT &HA1, Sakla(25) '========================================================= 'Bizim modeme ait IRQ'nun, Com2'ye ait interruptu 'kullanmas salanyor IntAdres = (IrqNo + 8) * 4 POKE IntAdres, PEEK(44) POKE IntAdres + 1, PEEK(45) POKE IntAdres + 2, PEEK(46) POKE IntAdres + 3, PEEK(47) '========================================================= 'Bizim modemin IRQ'su iin 8259'dan izin alnyor RESTORE IRQSerbest REDIM Oku(31) DEF SEG = VARSEG(Oku(0)) FOR PicMask = 0 TO 31 READ D% IF PicMask = 7 THEN D% = IrqNo POKE VARPTR(Oku(0)) + PicMask, D% NEXT PicMask CALL ABSOLUTE(VARPTR(Oku(0))) 'Modemin almas tamamland END SUB Ŀ Modem Kapama Yordam Ŀ SUB ModemiKapa (ModemAdresi) 'Modem kapatlyor PRINT #1, "ATH" OUT ModemAdresi + 4, (INP(ModemAdresi + 4) AND 252) CLOSE #1 '========================================================= 'Eski deerler iade ediliyor DEF SEG = 0 FOR I = 40 TO 63: 'nterrupt adresleri POKE I, Sakla(I - 40) NEXT OUT &H21, Sakla(24) 'PIC deerleri OUT &HA1, Sakla(25) POKE 1026, Sakla(26) 'Com2 adresi POKE 1027, Sakla(27) END SUB Ŀ Terminal (Yerel iletiim) Ŀ SUB Terminal COLOR 7, 1 CLS LOCATE 1, 1, 1: PRINT "Modem nstall ediliyor" PRINT #1, "ATZ" RR = FIX(TIMER) DO IF LOC(1) > 0 THEN B$ = B$ + INPUT$(LOC(1), #1) IF INSTR(B$, "OK") > 0 THEN EXIT DO IF FIX(TIMER) - RR > 5 THEN PRINT "Modem Port Adresi ve IRQ deerleri hatal !!" EXIT SUB END IF LOOP LOCATE 1, 1, 1 PRINT "Modem uygun bulundu, balad (k iin Esc)" DO A$ = INKEY$ IF A$ <> "" THEN IF ASC(A$) = 27 THEN EXIT DO PRINT #1, A$; : 'Modem girdisi ELSE IF LOC(1) > 0 THEN B$ = INPUT$(LOC(1), #1) PRINT #2, B$; : 'Modem kts END IF END IF LOOP END SUB Basic'de modemin programlanmas ile ilgili yaz dizimiz burada sona ermektedir. Modemin programlanmasnda sadece temel talar verilmitir. Bilgisayarn bir baka bilgisayar ile telefon hatt kullanarak irtibatn verilen bilgiler ile salayabilirsiniz. Ve uzaktaki bir arkadanz ile klavye zerinden sohbet edebilirsiniz. Ancak dosya transferi iin iki birim arasnda bir dosya transfer protolu yaplmas gerekir. Harici olarak kullanlan protokeller piyasada mevcuttur. En yaygn olan Z modem iletiim protolu olup DSZ.EXE veya DSZ.COM isimli programlar ile haricen kullanlabilir. Grmek zere.... Adres: PC World/Trkiye PS-Grol Demir Eski Bykdere cad. Sanayi mah. Behet sokak No:25/B Kat:5 80650 4.Levent / STANBUL Internet : gurold@doruk.com.tr